/*
 * Copyright (c) OSGi Alliance (2005). All Rights Reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this
 * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html.
 *
 * This copyright applies to the comments and public final static String fields only
 */
package org.osgi.core.framework.events
{
	import flash.events.Event;

	import org.osgi.core.framework.interfaces.IBundle;

	/**
	 * A general event from the Framework.
	 *
	 * <p>
	 * <code>FrameworkEvent</code> is the event class used when notifying
	 * listeners of general events occuring within the OSGI environment. A type code
	 * is used to identify the event type for future extendability.
	 *
	 * <p>
	 * OSGi Alliance reserves the right to extend the set of event types.
	 *
	 * @version $Revision: 1.14 $
	 */
	public class FrameworkEvent extends Event
	{
		private static var serialVersionUID:Number=207051004521261705;
		/**
		 * Bundle related to the event.
		 */
		private var bundle:IBundle;

		/**
		 * Exception related to the event.
		 */
		private var throwable:Error;

		/**
		 * The Framework has started.
		 *
		 * <p>
		 * This event is fired when the Framework has started after all
		 * installed bundles that are marked to be started have been started and the
		 * Framework has reached the intitial start level.
		 *
		 * <p>
		 * The value of <code>STARTED</code> is 0x00000001.
		 *
		 * @see StartLevel
		 */
		public static var STARTED:int=0x00000001;

		/**
		 * An error has occurred.
		 *
		 * <p>
		 * There was an error associated with a bundle.
		 *
		 * <p>
		 * The value of <code>ERROR</code> is 0x00000002.
		 */
		public static var ERROR:int=0x00000002;

		/**
		 * A PackageAdmin.refreshPackage operation has completed.
		 *
		 * <p>
		 * This event is fired when the Framework has completed the refresh
		 * packages operation initiated by a call to the
		 * PackageAdmin.refreshPackages method.
		 *
		 * <p>
		 * The value of <code>PACKAGES_REFRESHED</code> is 0x00000004.
		 *
		 * @since 1.2
		 * @see PackageAdmin#refreshPackages
		 */
		public static var PACKAGES_REFRESHED:int=0x00000004;

		/**
		 * A StartLevel.setStartLevel operation has completed.
		 *
		 * <p>
		 * This event is fired when the Framework has completed changing the
		 * active start level initiated by a call to the StartLevel.setStartLevel
		 * method.
		 *
		 * <p>
		 * The value of <code>STARTLEVEL_CHANGED</code> is 0x00000008.
		 *
		 * @since 1.2
		 * @see StartLevel
		 */
		public static var STARTLEVEL_CHANGED:int=0x00000008;

		/**
		 * A warning has occurred.
		 *
		 * <p>
		 * There was a warning associated with a bundle.
		 *
		 * <p>
		 * The value of <code>WARNING</code> is 0x00000010.
		 *
		 * @since 1.3
		 */
		public static var WARNING:int=0x00000010;

		/**
		 * An informational event has occurred.
		 *
		 * <p>
		 * There was an informational event associated with a bundle.
		 *
		 * <p>
		 * The value of <code>INFO</code> is 0x00000020.
		 *
		 * @since 1.3
		 */
		public static var INFO:int=0x00000020;

		/**
		 * Creates a Framework event regarding the specified bundle.
		 *
		 * @param type The event type.
		 * @param bundle The event source.
		 * @param throwable The related exception. This argument may be
		 *        <code>null</code> if there is no related exception.
		 */
		public function FrameworkEvent(type:String, bundle:IBundle=null, throwable:Error=null)
		{
			super(type)
			this.bundle=bundle;
			this.throwable=throwable;
		}

		/**
		 * Returns the exception related to this event.
		 *
		 * @return The related exception or <code>null</code> if none.
		 */
		public function getThrowable():Error
		{
			return throwable;
		}

		/**
		 * Returns the bundle associated with the event. This bundle is also the
		 * source of the event.
		 *
		 * @return The bundle associated with the event.
		 */
		public function getBundle():IBundle
		{
			return bundle;
		}

		/**
		 * Returns the type of framework event.
		 * <p>
		 * The type values are:
		 * <ul>
		 * <li>{@link #STARTED}
		 * <li>{@link #ERROR}
		 * <li>{@link #WARNING}
		 * <li>{@link #INFO}
		 * <li>{@link #PACKAGES_REFRESHED}
		 * <li>{@link #STARTLEVEL_CHANGED}
		 * </ul>
		 *
		 * @return The type of state change.
		 */
		public function getType():String
		{
			return type;
		}
	}
}